'Never' turi bo'yicha batafsil qo'llanma. Mustahkam, xatolarsiz kod uchun to'liq tekshiruvdan foydalanishni va uning an'anaviy xato bilan ishlashga aloqasini o'rganing.
Never Turi: Ish Vaqtidagi Xatolardan Kompilyatsiya Vaqti Kafolatlariga O'tish
Dasturiy ta'minotni ishlab chiqish dunyosida biz xatoliklarni oldini olish, topish va tuzatish uchun ko'p vaqt va kuch sarflaymiz. Eng makkor xatolardan ba'zilari jimgina paydo bo'ladiganlaridir. Ular ilovani darhol ishdan chiqarmaydi; aksincha, ular qayta ishlanmagan chekka holatlarda yashirinib, noto'g'ri xatti-harakatni keltirib chiqaradigan ma'lum bir ma'lumot yoki foydalanuvchi harakatini kutishadi. Bunday xatolarning keng tarqalgan manbai oddiy e'tiborsizlikdir: dasturchi tanlovlar to'plamiga yangi variant qo'shadi, lekin kodda uni qayta ishlashi kerak bo'lgan barcha joylarni yangilashni unutadi.
Foydalanuvchi bildirishnomalarining har xil turlarini qayta ishlaydigan `switch` operatorini ko'rib chiqaylik. Masalan, 'POLL_RESULT' kabi yangi bildirishnoma turi qo'shilganda, bildirishnomalarni ko'rsatish funksiyamizda tegishli `case` blokini qo'shishni unutsak nima bo'ladi? Ko'pgina tillarda kod shunchaki o'tib ketadi, hech narsa qilmaydi va jimgina ishdan chiqadi. Foydalanuvchi so'rovnoma natijasini hech qachon ko'rmaydi va biz xatoni haftalar davomida topa olmasligimiz mumkin.
Agar kompilyator bunga yo'l qo'ymasa-chi? Agar o'z vositalarimiz bizni har bir ehtimolni ko'rib chiqishga majbur qilsa-chi, bu potensial ish vaqtidagi mantiqiy xatoni kompilyatsiya vaqtidagi tur xatosiga aylantirsa-chi? Bu aynan zamonaviy statik tiplashtirilgan tillarda mavjud bo'lgan 'never' turining kuchi. Bu to'liq tekshirishni ta'minlash mexanizmi bo'lib, barcha holatlar ko'rib chiqilganligiga ishonchli, kompilyatsiya vaqti kafolatini beradi. Ushbu maqolada `never` turi, uning an'anaviy xatolarni qayta ishlash bilan solishtirgandagi roli o'rganiladi va undan qanday qilib yanada mustahkam va qo'llab-quvvatlanishi oson dasturiy tizimlarni qurishda foydalanish ko'rsatiladi.
'Never' Turi Aslida Nima?
Bir qarashda, `never` turi ezoterik yoki sof akademik bo'lib tuyulishi mumkin. Biroq, uning amaliy oqibatlari chuqurdir. Uni tushunish uchun uning ikkita asosiy xususiyatini anglab yetishimiz kerak.
Imkonsiz Narsalar Uchun Tur
`never` turi hech qachon yuz berishi mumkin bo'lmagan qiymatni ifodalaydi. Bu hech qanday mumkin bo'lgan qiymatlarni o'z ichiga olmaydigan turdir. Bu mavhum eshitiladi, lekin u ikkita asosiy stsenariyni bildirish uchun ishlatiladi:
- Hech qachon qaytmaydigan funksiya: Bu hech narsa qaytarmaydigan funksiya degani emas (bu `void`). Bu o'zining yakuniy nuqtasiga hech qachon yetib bormaydigan funksiya degani. U xatolik chiqarishi yoki cheksiz tsiklga tushib qolishi mumkin. Asosiysi, normal bajarilish oqimi butunlay to'xtatiladi.
- Imkonsiz holatdagi o'zgaruvchi: Mantiqiy xulosa (tipni toraytirish deb ataladigan jarayon) orqali kompilyator o'zgaruvchining kodning ma'lum bir bloki ichida hech qanday qiymatga ega bo'lishi mumkin emasligini aniqlashi mumkin. Bu holatda o'zgaruvchining turi amalda `never` bo'ladi.
Turlar nazariyasida `never` quyi tur (ko'pincha ⊥ bilan belgilanadi) sifatida tanilgan. Quyi tur bo'lish, uning boshqa har bir turning quyi turi ekanligini anglatadi. Bu mantiqan to'g'ri: `never` turidagi qiymat hech qachon mavjud bo'lmasligi sababli, uni `string`, `number` yoki `User` turidagi o'zgaruvchiga turlar xavfsizligini buzmasdan tayinlash mumkin, chunki bu kod satriga yetib borish imkonsizligi isbotlangan.
Muhim Farq: `never` va `void`
Keng tarqalgan chalkashliklardan biri `never` va `void` o'rtasidagi farqdir. Bu farq juda muhim:
void: Foydalanishga yaroqli qaytariladigan qiymatning yo'qligini bildiradi. Funksiya to'liq bajariladi va qaytadi, lekin uning qaytargan qiymatidan foydalanish ko'zda tutilmagan. Shunchaki konsolga ma'lumot chiqaradigan funksiyani tasavvur qiling.never: Qaytishning imkonsizligini bildiradi. Funksiya o'zining bajarilish yo'lini normal tarzda tugatmasligini kafolatlaydi.
Keling, TypeScript'dagi misolni ko'rib chiqamiz:
// Bu funksiya 'void' qaytaradi. U muvaffaqiyatli yakunlanadi.
function logMessage(message: string): void {
console.log(message);
// Yopiq tarzda 'undefined' qaytaradi
}
// Bu funksiya 'never' qaytaradi. U hech qachon yakunlanmaydi.
function throwError(message: string): never {
throw new Error(message);
}
// Bu funksiya ham cheksiz tsikl tufayli 'never' qaytaradi.
function processTasks(): never {
while (true) {
// ... navbatdan vazifani qayta ishlash
}
}
Bu farqni tushunish `never`ning amaliy kuchini ochishdagi birinchi qadamdir.
Asosiy Qo'llash Holati: To'liq Tekshiruv
`never` turining eng ta'sirli qo'llanilishi kompilyatsiya vaqtida to'liq tekshiruvlarni amalga oshirishdir. Bu bizga berilgan ma'lumotlar turining har bir varianti bilan ishlaganimizni ta'minlaydigan xavfsizlik to'rini qurishga imkon beradi.
Muammo: Mo'rt `switch` Operatori
Keling, geometrik shakllar to'plamini ajratilgan birlashma yordamida modellashtiramiz. Bu kuchli naqsh bo'lib, unda siz qaysi turdagi variant bilan ishlayotganingizni ko'rsatadigan umumiy xususiyatga (diskriminant, masalan `kind`) ega bo'lasiz.
type Shape =
| { kind: 'circle'; radius: number }
| { kind: 'square'; sideLength: number };
function getArea(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'square':
return shape.sideLength ** 2;
}
// Agar biz tanimaydigan shakl kelsa nima bo'ladi?
// Bu funksiya yopiq tarzda 'undefined' qaytaradi, bu esa ehtimoliy xato!
}
Bu kod hozircha ishlaydi. Lekin ilovamiz rivojlanganda nima bo'ladi? Hamkasbimiz yangi shakl qo'shadi:
type Shape =
| { kind: 'circle'; radius: number }
| { kind: 'square'; sideLength: number }
| { kind: 'rectangle'; width: number; height: number }; // Yangi shakl qo'shildi!
`getArea` funksiyasi endi to'liq emas. Agar u `rectangle` qabul qilsa, `switch` operatorida mos keladigan `case` bo'lmaydi, funksiya yakunlanadi va JavaScript/TypeScript'da `undefined` qaytaradi. Uni chaqirgan kod `number` kutgan edi, lekin `undefined` oladi, bu esa keyinchalik `NaN` xatosiga yoki boshqa nozik xatolarga olib keladi. Kompilyator bizga hech qanday ogohlantirish bermadi.
Yechim: Himoya Vositasisifatida `never` Turi
Buni `switch` operatorimizning `default` holatida `never` turidan foydalanib tuzatishimiz mumkin. Bu oddiy qo'shimcha kompilyatorni bizning hushyor hamkorimizga aylantiradi.
function getAreaWithExhaustiveCheck(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'square':
return shape.sideLength ** 2;
// 'rectangle' haqida-chi? Biz uni unutdik.
default:
// Sehr shu yerda sodir bo'ladi.
const _exhaustiveCheck: never = shape;
// Yuqoridagi qator endi kompilyatsiya vaqti xatosini keltirib chiqaradi!
// 'Rectangle' turi 'never' turiga tayinlanishi mumkin emas.
return _exhaustiveCheck;
}
}
Keling, bu nima uchun ishlashini tahlil qilamiz:
- Tipni toraytirish: Har bir `case` bloki ichida TypeScript kompilyatori `shape` o'zgaruvchisi turini toraytirish uchun yetarlicha aqlli. `case 'circle'` da kompilyator `shape` `{ kind: 'circle'; radius: number }` ekanligini biladi.
- `default` Bloki: Kod `default` blokiga yetganda, kompilyator `shape` qanday turlarda bo'lishi mumkinligini xulosa qiladi. U barcha qayta ishlangan holatlarni asl `Shape` birlashmasidan ayiradi.
- Xatolik Stsenariysi: Bizning yangilangan misolimizda biz `'circle'` va `'square'` ni qayta ishladik. Shuning uchun, `default` bloki ichida kompilyator `shape` `{ kind: 'rectangle'; ... }` bo'lishi kerakligini biladi. Keyin bizning kodimiz bu `rectangle` obyektini `never` turiga ega bo'lgan `_exhaustiveCheck` o'zgaruvchisiga tayinlashga harakat qiladi. Bu tayinlash aniq tur xatosi bilan muvaffaqiyatsiz bo'ladi: `'Rectangle' turi 'never' turiga tayinlanishi mumkin emas`. Xato kod ishga tushirilishidan oldin aniqlanadi!
- Muvaffaqiyat Stsenariysi: Agar biz `'rectangle'` uchun `case` qo'shsak, `default` blokida kompilyator barcha imkoniyatlarni tugatgan bo'ladi. `shape` ning turi `never` ga toraytiriladi (u doira, kvadrat yoki to'rtburchak bo'la olmaydi, shuning uchun bu imkonsiz tur). `never` turidagi qiymatni `never` turidagi o'zgaruvchiga tayinlash mutlaqo to'g'ri. Kod xatosiz kompilyatsiya qilinadi.
Ko'pincha "to'liqlik hiylasi" deb ataladigan bu naqsh kompilyatorni to'liqlikni ta'minlash uchun vakil qiladi. U mo'rt ish vaqti konventsiyasini mustahkam kompilyatsiya vaqti kafolatiga aylantiradi.
To'liq Tekshiruv va An'anaviy Xatolarni Qayta Ishlash
To'liq tekshiruvni xatolarni qayta ishlashning o'rnini bosuvchi vosita deb o'ylash vasvasasi bor, ammo bu noto'g'ri tushuncha. Ular turli sinfdagi muammolarni hal qilish uchun mo'ljallangan bir-birini to'ldiruvchi vositalardir. Asosiy farq ular nima bilan ishlashga mo'ljallanganligidadir: bashorat qilinadigan, ma'lum holatlar va bashorat qilib bo'lmaydigan, istisno holatlar.
Tushunchalarni Aniqlash
-
Xatolarni qayta ishlash ko'pincha dastur nazoratidan tashqarida bo'lgan istisno va oldindan aytib bo'lmaydigan vaziyatlarni boshqarish uchun ish vaqtidagi strategiyadir. U bajarilish paytida yuz berishi mumkin bo'lgan va yuz beradigan nosozliklar bilan shug'ullanadi.
- Misollar: Tarmoq so'rovining muvaffaqiyatsizligi, diskda faylning topilmasligi, yaroqsiz foydalanuvchi kiritishi, ma'lumotlar bazasi ulanishining vaqti tugashi.
- Vositalar: `try...catch` bloklari, `Promise.reject()`, xato kodlari yoki `null` qaytarish, `Result` turlari (Rust kabi tillarda ko'rinadi).
-
To'liq tekshiruv bu barcha ma'lum, yaroqli mantiqiy yo'llar yoki ma'lumotlar holatlari dastur mantig'i ichida aniq qayta ishlanganligini ta'minlash uchun kompilyatsiya vaqtidagi strategiyadir. Bu kodingizning to'liqligini ta'minlash haqida.
- Misollar: Enumning barcha variantlarini qayta ishlash, ajratilgan birlashmadagi barcha turlarni qayta ishlash, chekli holat mashinasining barcha holatlarini boshqarish.
- Vositalar: `never` turi, til tomonidan ta'minlangan `switch` yoki `match`ning to'liqligi (Swift va Rustda ko'rinadi).
Yo'naltiruvchi Printsip: Ma'lumlar va Noma'lumlar
Qaysi yondashuvni qo'llashni hal qilishning oddiy usuli - o'zingizdan muammoning tabiati haqida so'rash:
- Bu men o'z kod bazamda aniqlagan va nazorat qiladigan imkoniyatlar to'plamimi? To'liq tekshiruvdan foydalaning. Bular sizning "ma'lumlaringiz". Sizning `Shape` birlashmangiz mukammal misol; siz barcha mumkin bo'lgan shakllarni belgilaysiz.
- Bu tashqi tizimdan, foydalanuvchidan yoki atrof-muhitdan kelib chiqadigan, nosozlik bo'lishi mumkin bo'lgan va aniq kiritishni oldindan aytib bo'lmaydigan hodisami? Xatolarni qayta ishlashdan foydalaning. Bular sizning "noma'lumlaringiz". Tarmoq har doim mavjud bo'lishini isbotlash uchun turlar tizimidan foydalana olmaysiz.
Stsenariy Tahlili: Qachon Qaysinisidan Foydalanish Kerak
1-stsenariy: API Javobini Tahlil Qilish (Xatolarni Qayta Ishlash)
Tasavvur qiling, siz uchinchi tomon API'sidan foydalanuvchi ma'lumotlarini olayapsiz. API hujjatlarida `status` maydoniga ega JSON obyekti qaytarilishi aytilgan. Siz bunga kompilyatsiya vaqtida ishona olmaysiz. Tarmoq ishlamay qolishi, API eskirgan bo'lishi va 500 xatosini qaytarishi yoki noto'g'ri formatdagi JSON satrini qaytarishi mumkin. Bu xatolarni qayta ishlash sohasidir.
async function fetchUser(userId: string): Promise<User> {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
// HTTP xatolarini qayta ishlash (masalan, 404, 500)
throw new Error(`API Xatosi: ${response.status}`);
}
const data = await response.json();
// Bu yerda siz ma'lumotlar tuzilmasining ish vaqtida tekshiruvini ham qo'shishingiz kerak
return data as User;
} catch (error) {
// Tarmoq xatolari, JSON tahlil qilish xatolari va hk. ni qayta ishlash
console.error("Foydalanuvchini olishda xatolik:", error);
throw error; // Qayta chiqarish yoki chiroyli tarzda qayta ishlash
}
}
Bu yerda `never`dan foydalanish noo'rin bo'lar edi, chunki nosozlik imkoniyatlari cheksiz va bizning turlar tizimimizdan tashqarida.
2-stsenariy: UI Komponenti Holatini Ko'rsatish (To'liq Tekshiruv)
Endi, aytaylik, sizning UI komponentingiz bir nechta aniq belgilangan holatlardan birida bo'lishi mumkin. Siz bu holatlarni to'liq o'z ilovangiz kodi ichida nazorat qilasiz. Bu ajratilgan birlashma va to'liq tekshiruv uchun ajoyib nomzod.
type ComponentState =
| { status: 'loading' }
| { status: 'success'; data: string[] }
| { status: 'error'; message: string };
function renderComponent(state: ComponentState): string { // HTML satrini qaytaradi
switch (state.status) {
case 'loading':
return `<div>Yuklanmoqda...</div>`;
case 'success':
return `<ul>${state.data.map(item => `<li>${item}</li>`).join('')}</ul>`;
case 'error':
return `<div class="error">Xato: ${state.message}</div>`;
default:
// Agar keyinroq 'submitting' statusini qo'shsak, bu qator bizni himoya qiladi!
const _exhaustiveCheck: never = state;
throw new Error(`Qayta ishlanmagan holat: ${_exhaustiveCheck}`);
}
}
Agar dasturchi yangi holat, `{ status: 'idle' }` qo'shsa, kompilyator darhol `renderComponent`ni to'liq emas deb belgilaydi va komponent bo'sh joy sifatida ko'rsatiladigan UI xatosining oldini oladi.
Sinergiya: Mustahkam Tizimlar Uchun Ikkala Yondashuvni Birlashtirish
Eng mustahkam tizimlar birini tanlamaydi; ular ikkalasini ham birgalikda ishlatadilar. Xatolarni qayta ishlash tartibsiz tashqi dunyoni boshqaradi, to'liq tekshiruv esa ichki mantiqning to'g'ri va to'liqligini ta'minlaydi. Xatolarni qayta ishlash chegarasining natijasi ko'pincha to'liq tekshiruvga tayanadigan tizim uchun kirish ma'lumotiga aylanadi.
Keling, API'dan ma'lumot olish misolimizni takomillashtiramiz. Funksiya oldindan aytib bo'lmaydigan tarmoq xatolarini qayta ishlashi mumkin, lekin u nazorat qilinadigan tarzda muvaffaqiyatli yoki muvaffaqiyatsiz bo'lgandan so'ng, u ilovamizning qolgan qismi ishonch bilan qayta ishlashi mumkin bo'lgan bashorat qilinadigan, yaxshi tiplashtirilgan natijani qaytaradi.
// 1. Ichki mantig'imiz uchun bashorat qilinadigan, yaxshi tiplashtirilgan natijani aniqlang.
type FetchResult<T> =
| { status: 'success'; data: T }
| { status: 'error'; error: Error };
// 2. Funksiya endi To'liq Tekshirilishi mumkin bo'lgan natijani ishlab chiqarish uchun Xatolarni Qayta Ishlashdan foydalanadi.
async function fetchUserData(userId: string): Promise<FetchResult<User>> {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`API ${response.status} statusini qaytardi`);
}
const data = await response.json();
// Bu yerga ish vaqtidagi tekshiruvni qo'shing (masalan, Zod yoki io-ts bilan)
return { status: 'success', data: data as User };
} catch (error) {
// Biz HAR QANDAY potensial xatoni ushlaymiz va uni o'zimizning ma'lum tuzilmamizga o'raymiz.
return { status: 'error', error: error instanceof Error ? error : new Error('Noma\'lum xatolik yuz berdi') };
}
}
// 3. Chaqiruvchi kod endi toza, xavfsiz mantiq uchun To'liq Tekshiruvdan foydalanishi mumkin.
async function displayUser(userId: string) {
const result = await fetchUserData(userId);
switch (result.status) {
case 'success':
console.log(`Foydalanuvchi ismi: ${result.data.name}`);
break;
case 'error':
console.error(`Foydalanuvchini ko'rsatishda xatolik: ${result.error.message}`);
break;
default:
const _exhaustiveCheck: never = result;
// Bu, agar biz FetchResult'ga 'loading' statusini qo'shsak,
// bu kod bloki biz uni qayta ishlamagunimizcha kompilyatsiya qilinmasligini ta'minlaydi.
return _exhaustiveCheck;
}
}
Bu birlashtirilgan naqsh nihoyatda kuchli. `fetchUserData` funksiyasi chegara vazifasini o'taydi, tarmoq so'rovlarining oldindan aytib bo'lmaydigan dunyosini bashorat qilinadigan, ajratilgan birlashmaga aylantiradi. Ilovaning qolgan qismi esa bu toza ma'lumotlar tuzilmasi bilan kompilyatsiya vaqtidagi to'liqlik tekshiruvlarining to'liq xavfsizlik to'ri ostida ishlashi mumkin.
Global Perspektiva: Boshqa Tillarda `never`
Quyi tur va kompilyatsiya vaqtidagi to'liqlik tushunchasi faqat TypeScript'ga xos emas. Bu ko'plab zamonaviy, xavfsizlikka yo'naltirilgan tillarning o'ziga xos belgisidir. Uning boshqa joylarda qanday amalga oshirilganini ko'rish uning dasturiy injiniringdagi asosiy ahamiyatini mustahkamlaydi.
- Rust: Rust'da `!` turi mavjud bo'lib, u "never type" deb ataladi. Bu "diverge" qiladigan, ya'ni ajralib ketadigan funksiyalarning qaytarish turidir, masalan, joriy ijro oqimini to'xtatadigan `panic!()` makrosi. Rust'ning kuchli `match` ifodasi (uning `switch` versiyasi) sukut bo'yicha to'liqlikni talab qiladi. Agar siz `enum` bo'yicha `match` qilsangiz va barcha variantlarni qamrab olmasangiz, kod kompilyatsiya qilinmaydi. Qo'lda `never` hiylasiga ehtiyoj yo'q, chunki til bu xavfsizlikni o'z-o'zidan ta'minlaydi.
- Swift: Swift'da `Never` deb nomlangan bo'sh enum mavjud. U funksiya yoki metodning hech qachon qaytmasligini, ya'ni xato chiqarishi yoki tugamasligini bildirish uchun ishlatiladi. Rust kabi, Swift'ning `switch` operatorlari ham sukut bo'yicha to'liq bo'lishi talab qilinadi, bu esa enumlar bilan ishlaganda kompilyatsiya vaqtida xavfsizlikni ta'minlaydi.
- Kotlin: Kotlin'da `Nothing` turi mavjud bo'lib, u uning turlar tizimining quyi turidir. U funksiyaning hech qachon qaytmasligini bildirish uchun ishlatiladi, masalan, har doim xato chiqaradigan standart kutubxonaning `TODO()` funksiyasi. Kotlin'ning `when` ifodasi (uning `switch` ekvivalenti) ham to'liq tekshiruvlar uchun ishlatilishi mumkin va agar ifoda sifatida ishlatilganda to'liq bo'lmasa, kompilyator ogohlantirish yoki xato beradi.
- Python (Tur Izohlari bilan): Python'ning `typing` modulida `NoReturn` mavjud bo'lib, u hech qachon qaytmaydigan funksiyalarni izohlash uchun ishlatilishi mumkin. Python'ning tur tizimi bosqichma-bosqich va Rust yoki Swift kabi qat'iy bo'lmasa-da, bu izohlar Mypy kabi statik tahlil vositalari uchun qimmatli ma'lumot beradi, ular keyinchalik yanada chuqurroq tekshiruvlarni amalga oshirishi mumkin.
Bu turli ekotizimlar bo'ylab umumiy jihat shundaki, imkonsiz holatlarni tur darajasida ifodalab bo'lmaydigan qilish, butun bir xatolar sinfini yo'q qilishning kuchli usuli ekanligi tan olingan.
Amaliy Tushunchalar va Eng Yaxshi Amaliyotlar
Ushbu kuchli konsepsiyani kundalik ishingizga integratsiya qilish uchun quyidagi amaliyotlarni ko'rib chiqing:
- Ajratilgan Birlashmalardan Foydalaning: Bir nechta aniq variantlardan biri bo'lishi mumkin bo'lgan turga ega bo'lganingizda, ma'lumotlaringizni ajratilgan birlashmalar (shuningdek, tagged unions yoki sum types deb ham ataladi) bilan faol modellashtiring. Bu to'liq tekshiruv qurilgan poydevordir. API natijalari, komponent holatlari va hodisalarni shu tarzda modellashtiring.
- Noqonuniy Holatlarni Ifodalab Bo'lmaydigan Qiling: Bu turga asoslangan dizaynning asosiy tamoyilidir. Agar foydalanuvchi bir vaqtning o'zida ham admin, ham mehmon bo'la olmasa, sizning tur tizimingiz buni aks ettirishi kerak. Bir nechta ixtiyoriy mantiqiy bayroqlar (`isAdmin?: boolean; isGuest?: boolean;`) o'rniga birlashmalardan (`A | B`) foydalaning. `never` turi bir holatning ifodalab bo'lmasligini isbotlash uchun eng yaxshi vositadir.
-
Qayta Foydalanish Mumkin bo'lgan Yordamchi Funksiya Yarating: `default` holatini oddiy yordamchi funksiya bilan tozarroq qilish mumkin. Bu, shuningdek, agar kod ish vaqtida qachondir bu qatorga yetsa (bu imkonsiz bo'lishi kerak), yanada tavsiflovchi xatoni taqdim etadi.
function assertNever(value: never): never { throw new Error(`Qayta ishlanmagan ajratilgan birlashma a'zosi: ${JSON.stringify(value)}`); } // Foydalanish: default: assertNever(shape); // Tozaroq va ish vaqtida yaxshiroq xato xabarini beradi. - Kompilyatoringizni Tinglang: To'liqlik xatosiga bezovtalik sifatida emas, balki sovg'a sifatida qarang. Kompilyator sizning dasturingizda mantiqiy nuqson topgan g'ayratli, avtomatlashtirilgan kod tekshiruvchisi vazifasini bajarmoqda. Unga rahmat ayting va kodni tuzating.
Xulosa: Kodingizning Jim Himoyachisi
`never` turi nazariy qiziqishdan ancha ko'proq; u mustahkam, o'z-o'zini hujjatlashtiradigan va qo'llab-quvvatlanishi oson dasturiy ta'minot yaratish uchun amaliy va kuchli vositadir. Undan to'liq tekshiruv uchun foydalanish orqali biz to'g'rilikka bo'lgan yondashuvimizni tubdan o'zgartiramiz. Biz mantiqiy to'liqlikni ta'minlash yukini xatoga yo'l qo'yuvchi inson xotirasi va ish vaqtidagi testlashdan kompilyatsiya vaqtidagi turlar tahlilining xatosiz, avtomatlashtirilgan dunyosiga o'tkazamiz.
Tashqi tizimlarning oldindan aytib bo'lmaydigan tabiatini boshqarish uchun an'anaviy xatolarni qayta ishlash muhim bo'lib qolsa-da, to'liq tekshiruv ilovalarimizning ichki, ma'lum mantig'i uchun qo'shimcha kafolat beradi. Ular birgalikda xatolarga qarshi ko'p qatlamli himoyani shakllantiradi, bu nafaqat nosozliklarga kamroq moyil bo'lgan, balki tushunish osonroq va qayta ishlash uchun xavfsizroq tizimlarni yaratadi.
Keyingi safar ma'lum imkoniyatlar to'plami ustida `switch` operatori yoki uzun `if-else-if` zanjirini yozayotganingizda, to'xtab so'rang: `never` turi bu kod uchun jim himoyachi bo'lib xizmat qila oladimi? Shunday qilish orqali siz nafaqat bugungi kunda to'g'ri, balki ertangi kunning e'tiborsizliklaridan ham himoyalangan kod yozgan bo'lasiz.